const PI = 3.1415;
PI = 3; // TypeError: Assignment to constant variable. 声明后无法修改

const foo; // SyntaxError: Missing initializer in const declaration  只声明不赋值也会报错 必须立即初始化

//作用域与let命令相同： 只在声明所在的块级作用域内有效。
if (true) {
	const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined


//const命令声明的常量也不存在变量提升， 同样存在暂时性死区， 只能在声明的位置后面使用。
if (true) {
	console.log(MAX); // ReferenceError
	const MAX = 5;
}



//const声明的常量，也与let一样不可重复声明。
var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;



/*
将 对象 数组 用const来声明要注意的地方
const实际上保证的，并不是变量的值不得改动，而是变量指向的那个内存地址所保存的数据不得改动。
*/
const foo = {};
// 为 foo 添加一个属性，可以成功
foo.prop = 123;
// 将 foo 指向另一个对象，就会报错
foo = {}; // TypeError: "foo" is read-only 

const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错

/*
ES5 只有两种声明变量的方法：var命令和function命令。
ES6 除了添加let和const命令，
后面章节还会提到，另外两种声明变量的方法：import命令和class命令。
所以，ES6 一共有 6 种声明变量的方法。
*/